Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

WinDbg

帖子发起人: qstesiro   发起时间: 2014-12-30 16:13 下午   回复: 3

Print Search
帖子排序:    
   2014-12-30, 16:13 下午
qstesiro 离线,最后访问时间: 2015/4/15 5:07:35 qstesiro

发帖数前75位
注册: 2014-04-16
发 贴: 18
Tongue Tied [:S] !heap -p -a 显示栈不完整
Reply Quote
写了一个小程序学习!heap使用,但是出现栈显示不完整的问题,代码如下:

void HeapTest()
{
        PTSTR pszbuf = NULL;

        for (int i = 0; i < 5; ++i)
        {
                pszbuf = (PTSTR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 1025);
        }

        for (int i = 0; i < 5; ++i)
        {
                pszbuf = (PTSTR)malloc(2049);
        }

        for (int i = 0; i < 5; ++i)
        {
               pszbuf = new TCHAR[4097];
        }
}

在执行完此函数后执行如下操作,找到新申请的堆块,再执行!heap -p -a 用户地址,显示栈,但是发现只有从默认堆中声申请的块可以显示完整的栈,使用malloc与new申请的都不能完整显示,效果如下:

0> !heap -p -a  053cdbf8                                                                                    
address 053cdbf8 found in                                                                                   
_DPH_HEAP_ROOT @ 3c11000                                                                                    
in busy allocation (  DPH_HEAP_BLOCK:         UserAddr         UserSize -         VirtAddr         VirtSize)
                             3c13c30:          53cdbf8              401 -          53cd000             2000 
5bf18e89 verifier!AVrfDebugPageHeapAllocate+0x00000229                                                      
77100d96 ntdll!RtlDebugAllocateHeap+0x00000030                                                              
770baf0d ntdll!RtlpAllocateHeap+0x000000c4                                                                  
77063cfe ntdll!RtlAllocateHeap+0x0000023a                                                                   
00401819 demo!HeapTest+0x00000039                                                                           
00401888 demo!wmain+0x00000008                                                                              
00401170 demo!__tmainCRTStartup+0x0000010f                                                                  
758d338a kernel32!BaseThreadInitThunk+0x0000000e                                                            
77069f72 ntdll!__RtlUserThreadStart+0x00000070                                                              
77069f45 ntdll!_RtlUserThreadStart+0x0000001b  

使用malloc与new申请的块显示如下:                             
0> !heap -p -a 052ca7f8                                                                                      
address 052ca7f8 found in                                                                                    
_DPH_HEAP_ROOT @ 51d1000                                                                                     
in busy allocation (  DPH_HEAP_BLOCK:         UserAddr         UserSize -         VirtAddr         VirtSize) 
                             51d3f70:          52ca7f8              801 -          52ca000             2000  
5bf18e89 verifier!AVrfDebugPageHeapAllocate+0x00000229                                                       
77100d96 ntdll!RtlDebugAllocateHeap+0x00000030                                                               
770baf0d ntdll!RtlpAllocateHeap+0x000000c4                                                                   
77063cfe ntdll!RtlAllocateHeap+0x0000023a  
                                                                  
我使用debug版本不存在问题都是正常的,但是如果使用禁止优化的release就会出现这个问题,不知道是什么原因,请大家忙看看。

具体的环境是:程序编译为x86运行于win7 x64系统中,调试器为x86版本

另外我也看了一下运行时库中的其它堆块问题,栈也是不能完整显示的,都是类似如下的栈(列出如下三个),明显是少了msvcr80之前的栈信息:

0:000> !heap -p -a 051c2fd0                                                                                      
    address 051c2fd0 found in                                                                                    
    _DPH_HEAP_ROOT @ 50d1000                                                                                     
    in busy allocation (  DPH_HEAP_BLOCK:         UserAddr         UserSize -         VirtAddr         VirtSize) 
                                 50d2068:          51c2fd0               30 -          51c2000             2000  
    73458e89 verifier!AVrfDebugPageHeapAllocate+0x00000229                                                       
    77180d96 ntdll!RtlDebugAllocateHeap+0x00000030                                                               
    7713af0d ntdll!RtlpAllocateHeap+0x000000c4                                                                   
    770e3cfe ntdll!RtlAllocateHeap+0x0000023a                                                                    
    74744efe MSVCR80!_calloc_impl+0x00000125                                                                     
                                                                                                                 
                                                                                                                 
0:000> !heap -p -a 051c0fd8                                                                                      
    address 051c0fd8 found in                                                                                    
    _DPH_HEAP_ROOT @ 50d1000                                                                                     
    in busy allocation (  DPH_HEAP_BLOCK:         UserAddr         UserSize -         VirtAddr         VirtSize) 
                                 50d209c:          51c0fd8               24 -          51c0000             2000  
    73458e89 verifier!AVrfDebugPageHeapAllocate+0x00000229                                                       
    77180d96 ntdll!RtlDebugAllocateHeap+0x00000030                                                               
    7713af0d ntdll!RtlpAllocateHeap+0x000000c4                                                                   
    770e3cfe ntdll!RtlAllocateHeap+0x0000023a                                                                    
    74744efe MSVCR80!_calloc_impl+0x00000125                                                                     
                                                                                                                 
                                                                                                                 
0:000> !heap -p -a 051acfd8                                                                                      
    address 051acfd8 found in                                                                                    
    _DPH_HEAP_ROOT @ 50d1000                                                                                     
    in busy allocation (  DPH_HEAP_BLOCK:         UserAddr         UserSize -         VirtAddr         VirtSize) 
                                 50d22a4:          51acfd8               28 -          51ac000             2000  
    73458e89 verifier!AVrfDebugPageHeapAllocate+0x00000229                                                       
    77180d96 ntdll!RtlDebugAllocateHeap+0x00000030                                                               
    7713af0d ntdll!RtlpAllocateHeap+0x000000c4                                                                   
    770e3cfe ntdll!RtlAllocateHeap+0x0000023a                                                                    
    74744efe MSVCR80!_calloc_impl+0x00000125                                                                            

IP 地址: 已记录   报告
   2014-12-30, 21:48 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: !heap -p -a 显示栈不完整
Reply Quote
这是我试验的结果,也是release版,也是Win7上WoW

+    9d40 ( 13a80 -  9d40)      2 allocs        BackTrace4582230
+       1 (     2 -     1)      BackTrace4582230        allocations

        ntdll!RtlFreeHeap+000000A0
        msvcrt!malloc+0000008D
        MFC42!operator new+00000015
        HeapMfc!CHeapMfcDlg::OnNew+0000000F (C:\DbgLabs\HiHeap\HeapMfc\HeapMfcDlg.cpp, 178)
        MFC42!CCmdTarget::OnCmdMsg+0000013C
        MFC42!CDialog::OnCmdMsg+00000021
        MFC42!CWnd::OnCommand+00000099
        MFC42!CWnd::OnWndMsg+00000051
        MFC42!CWnd::WindowProc+0000002E
        MFC42!AfxCallWndProc+000000B5
        MFC42!AfxWndProc+0000003E
        MFC42!AfxWndProcBase+00000057
        USER32!InternalCallWinProc+00000023
        USER32!UserCallWinProcCheckWow+00000109

编译器是很老的VC6

IP 地址: 已记录   报告
   2015-01-02, 16:01 下午
qstesiro 离线,最后访问时间: 2015/4/15 5:07:35 qstesiro

发帖数前75位
注册: 2014-04-16
发 贴: 18
Re: !heap -p -a 显示栈不完整
Reply Quote
谢谢回复,我在家里也试了一下,是可以正常显示完整的栈(!heap 命令、umdh),环境:win7 (x64)、cdb (6.12.0002.633 X86)、VS2010,具体不清楚是什么问题,节后到公司更新一下调试器的版本,看看是调试器的版本问题还是与VS2005的运行时库的符号问题, 
IP 地址: 已记录   报告
   2015-01-12, 19:26 下午
qstesiro 离线,最后访问时间: 2015/4/15 5:07:35 qstesiro

发帖数前75位
注册: 2014-04-16
发 贴: 18
Re: !heap -p -a 显示栈不完整
Reply Quote
我在公司试了,调试器的版本是一样的,VS2005编译不能正常显示运行时库操作的栈,不知道是什么原因。
IP 地址: 已记录   报告
高端调试 » 软件调试 » WinDbg » !heap -p -a 显示栈不完整

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.